package com.example.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

// 扩展AbstractAnnotationConfigDispatcherServletInitializer的任意类都会
// 自动配置DispatcherServlet和Spring应用上下文
// Spring 的应用上下文会位于应用程序的Servlet上下文之中
//
// AbstractAnnotationConfigDispatcherServletInitializer剖析
// 在Servlet3.0环境中，容器会在类路径中查找实现了
// javax.servlet.ServletContainerInitializer接口的类，如果
// 能够发现的话，就会用它来配置Servlet容器
// Spring提供了这个接口的实现，名为SpringServletContainerInitializer
// 这个类反过来又会查找实现WebApplicationInitializer的类并将配置的任务
// 交给它们来完成。Spring 3.2引入了一个遍历的WebApplicationInitializer基础
// 实现，也就是AbstractAnnotationConfigDispatcherServletInitializer
// 由于我们的WebAppInitializer扩展了AbstractAnnotationConfigServletDispatcherInitializer
//  因此当部署到Servlet3.0容器的时候，容器会自动发现它，并用它来配置Servlet上下文
//
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    // getServletMappings()方法会将一个或多个路径映射到DispatcherServlet上
    @Override
    protected String[] getServletMappings() {
        // 将"/"映射到DispatcherServlet上
        // 这表示它会是应用的默认Servlet
        return new String[]{ "/" };
    }

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{ RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // 指定配置类
        return new Class[]{ WebConfig.class };
    }
}
